//package com.pig4cloud.pig.djjk.utils;
//
//import cn.hutool.core.convert.Convert;
//import com.hik.netsdk.HCNetSDK;
//import com.hik.netsdk.common.osSelect;
//import com.immi.uav.domain.po.DeviceInfo;
//import com.sun.jna.Native;
//import com.sun.jna.Pointer;
//import com.sun.jna.ptr.IntByReference;
//
//import java.util.HashMap;
//import java.util.Map;
//import java.util.logging.Logger;
//
//public class HikSdkUtil {
//    static Logger log = Logger.getLogger(HikSdkUtil.class.getName());
//    static HCNetSDK hCNetSDK = null;
//
//    static Map<String,Integer> lUserIDMap = new HashMap<>();//用户句柄
//
//    static FExceptionCallBack_Imp fExceptionCallBack;
//    static class FExceptionCallBack_Imp implements HCNetSDK.FExceptionCallBack {
//        public void invoke(int dwType, int lUserID, int lHandle, Pointer pUser) {
//            System.out.println("异常事件类型:"+dwType);
//            return;
//        }
//    }
//    /**
//     * 动态库加载
//     *
//     * @return
//     */
//    private static boolean createSDKInstance() {
//        if (hCNetSDK == null) {
//            synchronized (HCNetSDK.class) {
//                String strDllPath = "";
//                try {
//                    if (osSelect.isWindows())
//                        //win系统加载库路径
//                        strDllPath = System.getProperty("user.dir") + "\\libs\\HCNetSDK.dll";
//
//                    else if (osSelect.isLinux())
//                        //Linux系统加载库路径
//                    strDllPath = System.getProperty("user.dir") + "/libs/libhcnetsdk.so";
//                    hCNetSDK = (HCNetSDK) Native.loadLibrary("D:\\ss\\hik\\ClientDemo\\lib\\HCNetSDK.dll", HCNetSDK.class);
//                  //  hCNetSDK = (HCNetSDK) Native.loadLibrary(strDllPath, HCNetSDK.class);
//                } catch (Exception ex) {
//                    System.out.println("loadLibrary: " + strDllPath + " Error: " + ex.getMessage());
//                    return false;
//                }
//            }
//        }
//        return true;
//    }
//
//    /**
//     * 登录设备，支持 V40 和 V30 版本，功能一致。
//     *
//     * @param ip      设备IP地址
//     * @param port    SDK端口，默认为设备的8000端口
//     * @param user    设备用户名
//     * @param psw     设备密码
//     * @return 登录成功返回用户ID，失败返回-1
//     */
//    public static int loginDevice(String ip, short port, String user, String psw) {
//        // 创建设备登录信息和设备信息对象
//        HCNetSDK.NET_DVR_USER_LOGIN_INFO loginInfo = new HCNetSDK.NET_DVR_USER_LOGIN_INFO();
//        HCNetSDK.NET_DVR_DEVICEINFO_V40 deviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V40();
//
//        // 设置设备IP地址
//        byte[] deviceAddress = new byte[HCNetSDK.NET_DVR_DEV_ADDRESS_MAX_LEN];
//        byte[] ipBytes = ip.getBytes();
//        System.arraycopy(ipBytes, 0, deviceAddress, 0, Math.min(ipBytes.length, deviceAddress.length));
//        loginInfo.sDeviceAddress = deviceAddress;
//
//        // 设置用户名和密码
//        byte[] userName = new byte[HCNetSDK.NET_DVR_LOGIN_USERNAME_MAX_LEN];
//        byte[] password = psw.getBytes();
//        System.arraycopy(user.getBytes(), 0, userName, 0, Math.min(user.length(), userName.length));
//        System.arraycopy(password, 0, loginInfo.sPassword, 0, Math.min(password.length, loginInfo.sPassword.length));
//        loginInfo.sUserName = userName;
//
//        // 设置端口和登录模式
//        loginInfo.wPort = port;
//        loginInfo.bUseAsynLogin = false; // 同步登录
//        loginInfo.byLoginMode = 0; // 使用SDK私有协议
//
//        // 执行登录操作
//        int userID = hCNetSDK.NET_DVR_Login_V40(loginInfo, deviceInfo);
//        if (userID == -1) {
//            System.err.println("登录失败，错误码为: " + hCNetSDK.NET_DVR_GetLastError());
//        } else {
//            System.out.println(ip + " 设备登录成功！");
//            // 处理通道号逻辑
//            int startDChan = deviceInfo.struDeviceV30.byStartDChan;
//            System.out.println("预览起始通道号: " + startDChan);
//        }
//        return userID; // 返回登录结果
//    }
//
//
//    public static HCNetSDK.NET_DVR_PTZPOS getPTZPos(String deviceInfo){
//        int lUserID = lUserIDMap.get(deviceInfo);
//        // 获取PTZ坐标
//        HCNetSDK.NET_DVR_PTZPOS struPtTZPos = new HCNetSDK.NET_DVR_PTZPOS();
//        IntByReference pUsers = new IntByReference(1);
//        boolean b_GetPTZ = hCNetSDK.NET_DVR_GetDVRConfig(lUserID, HCNetSDK.NET_DVR_GET_PTZPOS, 1, struPtTZPos.getPointer(), struPtTZPos.size(), pUsers);
//        if (b_GetPTZ == false) {
//            log.warning("获取PTZ坐标信息失败，错误码：" + hCNetSDK.NET_DVR_GetLastError());
//            return null;
//        }else{
//            struPtTZPos.read();
//        }
//        return struPtTZPos;
//    }
//
//
//    public static void setPTZPos(String deviceInfo,HCNetSDK.NET_DVR_PTZPOS struPtTZPos){
//        int lUserID = lUserIDMap.get(deviceInfo);
//        struPtTZPos.wAction = 2;
//        struPtTZPos.write();
//        boolean b_SetPTZ = hCNetSDK.NET_DVR_SetDVRConfig(lUserID, HCNetSDK.NET_DVR_SET_PTZPOS, 1, struPtTZPos.getPointer(), struPtTZPos.size());
//        if (!b_SetPTZ) {
//            log.warning("设置PTZ坐标信息失败，错误码：" + hCNetSDK.NET_DVR_GetLastError());
//        } else {
//            log.info("设置PTZ成功");
//        }
//    }
//
//    public static void gotoPreset(String deviceInfo){
//        int lUserID = lUserIDMap.get(deviceInfo);
//        boolean presetOther = hCNetSDK.NET_DVR_PTZPreset_Other(lUserID,1,39,1);
//        if (!presetOther) {
//            log.warning("跳轉預置點失败，错误码：" + hCNetSDK.NET_DVR_GetLastError());
//        } else {
//            log.info("跳轉預置點成功");
//        }
//    }
//
//    public static void setPTZZoomIn(String deviceInfo,HCNetSDK.NET_DVR_POINT_FRAME pStruPointFrame){
//        int lUserID = lUserIDMap.get(deviceInfo);
//
////        pStruPointFrame.xTop = 96; //方框起始点的x坐标
////        pStruPointFrame.yTop = 198; //方框起始点的y坐标
////        pStruPointFrame.xBottom = 197;  //方框结束点的x坐标
////        pStruPointFrame.yBottom = 68;   //方框结束点的y坐标
//        boolean point_frame = hCNetSDK.NET_DVR_PTZSelZoomIn_EX
//                (lUserID, 1, pStruPointFrame);
//        if (!point_frame) {
//            log.warning("云台3D定位失败，错误码：" + hCNetSDK.NET_DVR_GetLastError());
//        } else {
//            log.info("云台3D定位成功");
//        }
//    }
//
//    public static void logoutDevice(int userID) {
//        // 执行登出操作
//        boolean logoutResult = hCNetSDK.NET_DVR_Logout(userID);
//        if (logoutResult) {
//            log.info("设备登出成功！"+userID);
//        }else {
//            log.warning("设备登出失败，错误码为: " + hCNetSDK.NET_DVR_GetLastError()+userID);
//        }
//    }
//
//    public static void initSDK(Map<String, DeviceInfo> deviceInfoMap) {
////        deviceMap.put("device1","172.16.31.101,admin,Ysbj@2022");
//        // 创建一个线程，用于在程序退出时执行
//        Thread shutdownHook = new Thread(() -> {
//            log.info("程序正在退出，摄像头登出...");
//            lUserIDMap.forEach((key,value)->{
//                logoutDevice(value);
//            });
//        });
//
//        // 添加关机钩子
//        Runtime.getRuntime().addShutdownHook(shutdownHook);
//
//        if (hCNetSDK == null) {
//            if (!createSDKInstance()) {
//                System.out.println("Load SDK fail");
//                return;
//            }
//        }
//
//        //linux系统建议调用以下接口加载组件库
//        if (osSelect.isLinux()) {
//            HCNetSDK.BYTE_ARRAY ptrByteArray1 = new HCNetSDK.BYTE_ARRAY(256);
//            HCNetSDK.BYTE_ARRAY ptrByteArray2 = new HCNetSDK.BYTE_ARRAY(256);
//            //这里是库的绝对路径，请根据实际情况修改，注意改路径必须有访问权限
//            String strPath1 = System.getProperty("user.dir") + "/libs/libcrypto.so.1.1";
//            String strPath2 = System.getProperty("user.dir") + "/libs/libssl.so.1.1";
//            System.arraycopy(strPath1.getBytes(), 0, ptrByteArray1.byValue, 0, strPath1.length());
//            ptrByteArray1.write();
//            hCNetSDK.NET_DVR_SetSDKInitCfg(HCNetSDK.NET_SDK_INIT_CFG_LIBEAY_PATH, ptrByteArray1.getPointer());
//            System.arraycopy(strPath2.getBytes(), 0, ptrByteArray2.byValue, 0, strPath2.length());
//            ptrByteArray2.write();
//            hCNetSDK.NET_DVR_SetSDKInitCfg(HCNetSDK.NET_SDK_INIT_CFG_SSLEAY_PATH, ptrByteArray2.getPointer());
//            String strPathCom = System.getProperty("user.dir") + "/libs/";
//            HCNetSDK.NET_DVR_LOCAL_SDK_PATH struComPath = new HCNetSDK.NET_DVR_LOCAL_SDK_PATH();
//            System.arraycopy(strPathCom.getBytes(), 0, struComPath.sPath, 0, strPathCom.length());
//            struComPath.write();
//            hCNetSDK.NET_DVR_SetSDKInitCfg(HCNetSDK.NET_SDK_INIT_CFG_SDK_PATH, struComPath.getPointer());
//        }
////SDK初始化，一个程序只需要调用一次
//        boolean initSuc = hCNetSDK.NET_DVR_Init();
//        //异常消息回调
//        if(fExceptionCallBack == null)
//        {
//            fExceptionCallBack = new FExceptionCallBack_Imp();
//        }
//        Pointer pUser = null;
//        if (!hCNetSDK.NET_DVR_SetExceptionCallBack_V30(0, 0, fExceptionCallBack, pUser)) {
//            return ;
//        }
//        System.out.println("设置异常消息回调成功");
//
//        //启动SDK写日志
//        hCNetSDK.NET_DVR_SetLogToFile(3, "./sdkLog", false);
//
//
//        //设备登录
//        deviceInfoMap.forEach((k,v)->{
//            lUserIDMap.put(k,loginDevice(v.getDeviceIP(), Convert.toShort(v.getDevicePort()),v.getDeviceAccount(),v.getDevicePwd()));
//        });
//
//    }
//
////    public static void main(String[] args) {
////        initSDK();
////        while (true){
////            System.out.println("请输入坐标! ");
////            Scanner input2 = new Scanner(System.in);
////            String xy =input2.next();
////            List<String> xyList = StrUtil.split(xy,',');
////
////            HCNetSDK.NET_DVR_POINT_FRAME net_dvr_point_frame = new HCNetSDK.NET_DVR_POINT_FRAME();
////
////            net_dvr_point_frame.xTop = Integer.parseInt(xyList.get(0));
////            net_dvr_point_frame.yTop = Integer.parseInt(xyList.get(1));
////            net_dvr_point_frame.xBottom = Integer.parseInt(xyList.get(2));
////            net_dvr_point_frame.yBottom = Integer.parseInt(xyList.get(3));
////            HikSdkUtil.setPTZZoomIn("device1",net_dvr_point_frame);
////        }
////    }
//}
